package com.hibegin.http.server.web;

import com.hibegin.http.server.impl.HttpRequest;
import com.hibegin.http.server.impl.HttpResponse;
import com.szwistar.common.datastruct.Reflector;
import com.szwistar.common.datastruct.Utils;
import com.szwistar.common.os.PathUtils;

import java.lang.reflect.Method;

/**
 * 拦截器：执行 URL 所映射的 Controller 方法
 */
public class Interceptor4Controller implements Interceptor {
    @Override
    public boolean doInterceptor(HttpRequest request, HttpResponse response) throws Exception {
    	String uri = request.getUri();
    	String methodName = PathUtils.getTail(uri);
    	uri = PathUtils.getParent(uri);

        // 尝试查找映射的 Controller
    	Controller controller = request.getServer().getServerConfig().getControllerMapper(uri);
        // 没有对应的 Controller，则本拦截器无法处理此请求
        if (controller == null) { return true; }

        // 查找匹配的 method
        Method method = Reflector.getMethod(controller.getClass(), methodName, HttpRequest.class, HttpResponse.class);
        // 没有对应的 method，则本拦截器无法处理此请求
        if (method == null) { return true; }

        // !!!调用  Controller 的方法!!!
        Object ret = method.invoke(controller, request, response);

        // 如果返回值是布尔型的，则返回它的值
        return Utils.isBooleanValue(ret) ? ((Boolean)ret) : false;
    }
}
